package com.android.test

import android.app.Application
import androidx.lifecycle.AndroidViewModel

/**
 *AndroidViewModel和ViewModel的区别分析：
 *AndroidViewModel 是 ViewModel 的一个子类，它们核心功能一致，
 * 但有一个关键区别：AndroidViewModel 内部持有 Application 上下文。
 * AndroidViewModel 是 ViewModel 的子类。它在基类的基础上，在构造函数中接收一个 Application 参数，并提供了一个 getApplication() 方法来获取它。
 * Application 上下文是全局的、单例的，它的生命周期与应用进程的生命周期一致。因此，它不会因为Activity或Fragment的销毁而导致内存泄漏。你需要Application上下文的情况通常包括：
 *
 *ViewModel 类的主要设计目的是以生命周期感知的方式存储和管理UI相关的数据。它的最大特点是在配置变更（如屏幕旋转）时不会被销毁，从而保证了数据的连续性，避免了重新加载数据和重新处理耗时操作。
 *
 * 持有 LiveData 或 StateFlow，用于在View（Activity/Fragment）和数据层之间通信。
 * 从Repository（数据仓库）获取数据。
 * 处理简单的UI逻辑。
 *
 * 遵循以下原则：
 * 优先使用 ViewModel：在绝大多数情况下，你只需要一个普通的 ViewModel。你应该通过依赖注入（如Hilt）将Repository、DataSource等传递给ViewModel，而不是在ViewModel内部用上下文去获取它们。这是更干净、更可测试的架构。
 * 仅在确有必要时使用 AndroidViewModel：只有当你明确需要 Application 上下文（例如访问系统服务）时，才选择使用 AndroidViewModel。不要因为它能提供上下文就滥用它。
 * 绝对禁止：永远不要在ViewModel中尝试持有或获取非Application的上下文（如Activity的Context）。
 *
 * Created by zxn on 2025/9/4.
 **/
class MainViewModel(application: Application) : AndroidViewModel(application){

    /**
     * 可以直接通过getApplication获取
     */
    override fun <T : Application> getApplication(): T {
        return super.getApplication()
    }
}